home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / zugabe / va45 / visual45 / library / extend / rsc.s < prev    next >
Text File  |  1998-07-25  |  34KB  |  1,376 lines

  1. ;------------------------------------------------------------------------------
  2. ; Method name : -
  3. ; Asm label   : GWVA_RSC_TEST_IF_TEDINFO_STRUCT_EXIST_IDX
  4. ; Description : Indique si l'objet RSC contient une structure TEDINFO
  5. ;
  6. ; Rq  : a0.l/d0.l modifié
  7. ; in  : a0.l = pointeur sur l'arbre RSC
  8. ; in  : d0.w = index de l'objet RSC
  9. ; out : d7.w = GWVA_NO_ERROR_GENERIC si un TEDINFO existe, GWVA_NO_ERROR_GENERIC sinon
  10. ;
  11. ; 24/05/98 : Création
  12. ;------------------------------------------------------------------------------
  13. GWVA_RSC_TEST_IF_TEDINFO_STRUCT_EXIST_IDX:
  14.     mulu #L_OBJECT,d0
  15.     add.l d0,a0
  16.     bra GWVA_RSC_TEST_IF_TEDINFO_STRUCT_EXIST
  17.  
  18. ;------------------------------------------------------------------------------
  19. ; Method name : -
  20. ; Asm label   : GWVA_RSC_TEST_IF_TEDINFO_STRUCT_EXIST
  21. ; Description : Indique si l'objet RSC contient une structure TEDINFO
  22. ;
  23. ; Rq  : -
  24. ; in  : a0.l = pointeur sur l'objet RSC
  25. ; out : d7.w = GWVA_NO_ERROR_GENERIC si un TEDINFO existe, GWVA_NO_ERROR_GENERIC sinon
  26. ;
  27. ; 24/05/98 : Création
  28. ;------------------------------------------------------------------------------
  29. GWVA_RSC_TEST_IF_TEDINFO_STRUCT_EXIST:
  30.  
  31.     move.w #GWVA_ERROR_GENERIC,d7
  32.  
  33.     cmp.w #G_TEXT,ob_type(a0)
  34.     beq.s .TEDINFO
  35.     cmp.w #G_BOXTEXT,ob_type(a0)
  36.     beq.s .TEDINFO
  37.     cmp.w #G_FTEXT,ob_type(a0)
  38.     beq.s .TEDINFO
  39.     cmp.w #G_FBOXTEXT,ob_type(a0)
  40.     bne.s .pas_TEDINFO
  41. .TEDINFO:
  42.     move.w #GWVA_NO_ERROR_GENERIC,d7
  43. .pas_TEDINFO:
  44.     rts
  45.  
  46. ;------------------------------------------------------------------------------
  47. ; Method name : -
  48. ; Asm label   : GWVA_RSC_GO_OVER_TREE
  49. ; Description : Parcours un (sous-)arbre et exécute un routine pour chaque objet
  50. ; Description : de cet arbre.
  51. ;
  52. ; Rq  : La routine ne s'arrête qu'une fois tous les objets parcourus ou bien
  53. ; Rq  : jusqu'à ce que la routine renvoit d7.w = GWVA_RSC_CTE_STOP_GO_OVER.
  54. ; Rq  : La routine reçoit les paramètres suivant :
  55. ; Rq  : in  : a0.l = adresse de base de l'arbre (objet #0)
  56. ; Rq  : in  : a1.l = pointeur sur la routine à exécuter (terminée par un RTS)
  57. ; Rq  : in  : a2.l = pointeur sur l'objet courant
  58. ; Rq  : in  : d0.w = index de l'objet courant
  59. ; Rq  : in  : d1.w = index du père de l'objet courant (-1 pour le root)
  60. ; Rq  : La routine doit renvoyer le paramètre :
  61. ; Rq  : out : d7.w = GWVA_RSC_CTE_CONTINUE_GO_OVER ou GWVA_RSC_CTE_STOP_GO_OVER
  62. ;
  63. ; in  : a0.l = adresse de base de l'arbre (objet #0)
  64. ; in  : a1.l = pointeur sur la routine à exécuter (terminée par un RTS)
  65. ; in  : a2.l = pointeur sur l'objet de départ du parcours
  66. ; in  : d0.w = index de l'objet de départ
  67. ; in  : d1.w = index du père de l'objet de départ (-1 pour le root)
  68. ;
  69. ; 23/05/98 : Création
  70. ;------------------------------------------------------------------------------
  71. GWVA_RSC_GO_OVER_TREE:
  72.     link a6,#-(2+4)
  73.     move.w d1,(a7)    ; stock numéro du père
  74. .same_level:
  75.     move.l a2,2(a7)    ; et l'adresse de l'objet courant
  76.  
  77.     save.l a0-a2/a6/d0-d1
  78.     jsr (a1)
  79.     load.l a0-a2/a6/d0-d1
  80.     cmp.w #GWVA_RSC_CTE_STOP_GO_OVER,d7
  81.     beq.s .stop_recursif
  82.  
  83.     move ob_head(a2),d1    ; ai-je un fils ?
  84.     bpl.s .child_exist
  85.  
  86. .continue_brother_father:
  87.     move ob_next(a2),d1    ; ai-je une famille autre que mon père
  88.     move.w d1,d0
  89.  
  90.     cmp.w (a7),d1
  91.     beq.s .back_2_father
  92.  
  93.     mulu #L_OBJECT,d1
  94.     lea (a0,d1.l),a2
  95.     bra.s .same_level
  96.  
  97. .child_exist:
  98.     move.w d1,d2    ; d2.w : fils
  99.     mulu #L_OBJECT,d1
  100.     lea (a0,d1.l),a2
  101.     move.w d0,d1    ; d1.w : l'ancien père c'est moi
  102.     move.w d2,d0    ; d0.w ; courant = fils
  103.     bsr GWVA_RSC_GO_OVER_TREE
  104.     move.l 2(a7),a2    ; mon adresse
  105.     cmp.w #GWVA_RSC_CTE_STOP_GO_OVER,d7
  106.     bne.s .continue_brother_father
  107.     bra.s .stop_recursif
  108.  
  109. .back_2_father:
  110.     move.w #GWVA_RSC_CTE_CONTINUE_GO_OVER,d7
  111. .stop_recursif:
  112.     unlk a6
  113.     rts
  114.  
  115. ;------------------------------------------------------------------------------
  116. ; Method name : -
  117. ; Asm label   : GWVA_RSC_ENABLE_DISABLE_OBJECT
  118. ; Description : active/déactive un objet GEM
  119. ; in  : d0.w = index du formulaire
  120. ; in  : d1.w = index de l'objet
  121. ; in  : d2.w = nouvel état désiré (0 : enable, 1 : disable)
  122. ;
  123. ; 19/03/98 : Création
  124. ;------------------------------------------------------------------------------
  125. GWVA_RSC_ENABLE_DISABLE_OBJECT:    ; d0.w : numéro du formulaire, d1.w : numéro de l'objet, d2=nouvel état (1=disable)
  126.  
  127.     save.w d2
  128.     bsr GWVA_RSC_RETURN_PTR_ON_OBJ
  129.     load.w d2
  130.  
  131.     bclr #DISABLED,ob_state+1(a1)
  132.     tst d2
  133.     beq.s .cleared
  134.     bset #DISABLED,ob_state+1(a1)
  135. .cleared:    rts
  136.  
  137. ;------------------------------------------------------------------------------
  138. ; Method name : -
  139. ; Asm label   : GWVA_RSC_RETURN_OBJ_POS_SIZE
  140. ; Description : Renvoie la position et la taille "vraies" d'un objet GEM, 
  141. ; Description : sculptures comprises
  142. ; Rq  : Problèmes si les sculptures d'un fils dépassent de son père
  143. ;
  144. ; in  : a0.l = pointeur sur l'arbre
  145. ; in  : d0.w = index de l'objet
  146. ; out : a0.l = pointeur sur l'objet
  147. ; out : d0-d3.w = x,y,w,h réelle de l'objet
  148. ;
  149. ; 19/03/98 : Création
  150. ;------------------------------------------------------------------------------
  151. GWVA_RSC_RETURN_OBJ_POS_SIZE:
  152.  
  153.     move.w d0,d7    ; pour plus tard ...
  154.     move.l a0,a1    ; pour plus tard ...
  155.  
  156.     mulu #L_OBJECT,d0
  157.     lea (a0,d0.l),a0    ; ptr sur l'objet GEM
  158.  
  159.     clr.w d0
  160.     move.b ob_type+1(a0),d0    ; type de l'objet
  161.  
  162.     clr.w d1        ; épaisseur bord gauche
  163.     clr.w d2        ; épaisseur bord droit
  164.     clr.w d3        ; épaisseur bord haut
  165.     clr.w d4        ; épaisseur bord bas
  166.  
  167.     cmp.w #G_BOX,d0
  168.     beq .taille_bord_dans_ob_spec
  169.     cmp.w #G_IBOX,d0
  170.     beq .taille_bord_dans_ob_spec
  171.     cmp.w #G_BOXCHAR,d0
  172.     beq .taille_bord_dans_ob_spec
  173.  
  174.     cmp.w #G_BOXTEXT,d0
  175.     beq .taille_bord_dans_structure_ob_spec
  176.     cmp.w #G_FBOXTEXT,d0
  177.     beq .taille_bord_dans_structure_ob_spec
  178.  
  179. .tests_ob_state:
  180.     move.w ob_state(a0),d0
  181.  
  182.     btst #OUTLINED,d0
  183.     beq.s .pas_outlined
  184.  
  185.     cmp.w #GWVA_RSC_CTE_EPAISSEUR_OUTLINED,d1
  186.     bge.s .taille_prise_en_compte
  187.     move.w #GWVA_RSC_CTE_EPAISSEUR_OUTLINED,d1
  188.     move.w #GWVA_RSC_CTE_EPAISSEUR_OUTLINED,d2
  189.     move.w #GWVA_RSC_CTE_EPAISSEUR_OUTLINED,d3
  190.     move.w #GWVA_RSC_CTE_EPAISSEUR_OUTLINED,d4
  191. .taille_prise_en_compte:
  192. .pas_outlined:
  193.  
  194.     btst #SHADOWED,d0
  195.     beq.s .pas_shadowed
  196.  
  197.     cmp.w #GWVA_RSC_CTE_EPAISSEUR_SHADOWED,d2
  198.     bge.s .taille_prise_en_compte2a
  199.     move.w #GWVA_RSC_CTE_EPAISSEUR_SHADOWED,d2
  200. .taille_prise_en_compte2a:
  201.     cmp.w #GWVA_RSC_CTE_EPAISSEUR_SHADOWED,d4
  202.     bge.s .taille_prise_en_compte2b
  203.     move.w #GWVA_RSC_CTE_EPAISSEUR_SHADOWED,d4
  204. .taille_prise_en_compte2b:
  205. .pas_shadowed:
  206.  
  207.     move.w GWVA_ROOT_SYSTEM_AES_3D_VBORDER,d5
  208.     move.w GWVA_ROOT_SYSTEM_AES_3D_HBORDER,d6
  209.  
  210.     move.w ob_flags(a0),d0
  211.  
  212.     and.w #MASK_FL3DIND|MASK_FL3DBAK,d0    ; on garde que les bits 3D
  213.  
  214.     cmp.w #MASK_FL3DIND,d0
  215.     beq.s .bit_indicateur3D
  216.     cmp.w #MASK_FL3DACT,d0
  217.     bne.s .pas_activateur3D
  218. .bit_indicateur3D:
  219.     cmp.w d5,d1
  220.     bge.s .taille_prise_en_compte3a
  221.     move.w d5,d1
  222. .taille_prise_en_compte3a:
  223.     cmp.w d5,d2
  224.     bge.s .taille_prise_en_compte3b
  225.     move.w d5,d2
  226. .taille_prise_en_compte3b:
  227.  
  228.     cmp.w d6,d3
  229.     bge.s .taille_prise_en_compte4a
  230.     move.w d6,d3
  231. .taille_prise_en_compte4a:
  232.     cmp.w d6,d4
  233.     bge.s .taille_prise_en_compte4b
  234.     move.w d6,d4
  235. .taille_prise_en_compte4b:
  236. .pas_activateur3D:
  237.  
  238.     tst.w d1
  239.     bge.s .bord_gauche_positif
  240.     clr.w d1
  241. .bord_gauche_positif:
  242.     tst.w d2
  243.     bge.s .bord_droit_positif
  244.     clr.w d2
  245. .bord_droit_positif:
  246.     tst.w d3
  247.     bge.s .bord_haut_positif
  248.     clr.w d3
  249. .bord_haut_positif:
  250.     tst.w d4
  251.     bge.s .bord_bas_positif
  252.     clr.w d4
  253. .bord_bas_positif:
  254.  
  255.     clr.w d0
  256.     move.b ob_type+1(a0),d0
  257.  
  258.     cmp.w #G_BUTTON,d0
  259.     bne.s .pas_tests_bouton
  260.  
  261.     cmp.w #GWVA_RSC_CTE_EPAISSEUR_G_BUTTON,d1    ; taille de 1 en plus de base pour les boutons
  262.     bge.s .taille_prise_en_compte7a
  263.     move.w #GWVA_RSC_CTE_EPAISSEUR_G_BUTTON,d1
  264. .taille_prise_en_compte7a:
  265.     cmp.w #GWVA_RSC_CTE_EPAISSEUR_G_BUTTON,d2
  266.     bge.s .taille_prise_en_compte7b
  267.     move.w #GWVA_RSC_CTE_EPAISSEUR_G_BUTTON,d2
  268. .taille_prise_en_compte7b:
  269.  
  270.     cmp.w #GWVA_RSC_CTE_EPAISSEUR_G_BUTTON,d3
  271.     bge.s .taille_prise_en_compte8a
  272.     move.w #GWVA_RSC_CTE_EPAISSEUR_G_BUTTON,d3
  273. .taille_prise_en_compte8a:
  274.     cmp.w #GWVA_RSC_CTE_EPAISSEUR_G_BUTTON,d4
  275.     bge.s .taille_prise_en_compte8b
  276.     move.w #GWVA_RSC_CTE_EPAISSEUR_G_BUTTON,d4
  277. .taille_prise_en_compte8b:
  278.  
  279.     move.w ob_flags(a0),d0
  280.  
  281.     btst #MASK_DEFAULT,d0
  282.     beq.s .pas_defaut
  283.     addq.w #1,d1        ; se rajoute à tout
  284.     addq.w #1,d2
  285.     addq.w #1,d3
  286.     addq.w #1,d4
  287. .pas_defaut:
  288.     btst #MASK_EXIT,d0
  289.     beq.s .pas_exit
  290.     addq.w #1,d1        ; se rajoute à tout
  291.     addq.w #1,d2
  292.     addq.w #1,d3
  293.     addq.w #1,d4
  294. .pas_exit:
  295. .pas_tests_bouton:
  296.  
  297.     save.l d0-d4/a0
  298.     objc_offset a1,d7
  299.     load.l d0-d4/a0
  300.  
  301.     movem.w int_out+1*2,d5-d6
  302.     sub.w d1,d5
  303.     sub.w d3,d6
  304.     add.w d1,d2
  305.     add.w d4,d3
  306.     add.w ob_width(a0),d2
  307.     add.w ob_height(a0),d3
  308.     move.w d5,d0
  309.     move.w d6,d1
  310.  
  311.     rts
  312.  
  313. .taille_bord_dans_ob_spec:
  314.     move.b ob_spec+1(a0),d1        ; epaisseur signée de la bordure
  315.     ext.w d1
  316.     neg.w d1
  317.     move.w d1,d2
  318.     move.w d1,d3
  319.     move.w d1,d4
  320.     bra .tests_ob_state
  321. .taille_bord_dans_structure_ob_spec:
  322.     move.w ([a0,ob_spec],te_thickness),d1    ; epaisseur signée de la bordure
  323.     neg.w d1
  324.     move.w d1,d2
  325.     move.w d1,d3
  326.     move.w d1,d4
  327.     bra .tests_ob_state
  328.  
  329. ;------------------------------------------------------------------------------
  330. ; Method name : -
  331. ; Asm label   : GWVA_RSC_RETURN_PTR_ON_TEXT
  332. ; Description : Renvoie les tailles courantes et max. d'un objet RSC contenant du texte.
  333. ; in  : d0.w = numéro formulaire 
  334. ; in  : d1.w = numéro de l'objet avec ted info : G_TEXT ou G_BOXTEXT ou G_FTEXT 
  335. ;       ou G_FBOXTEXT ou sans : G_STRING ... etc ...
  336. ; out : a0.l = pointeur sur l'objet RSC
  337. ; out : a1.l = pointeur sur le texte
  338. ;
  339. ; 01/02/98 : Création
  340. ;------------------------------------------------------------------------------
  341. GWVA_RSC_RETURN_PTR_ON_TEXT:
  342.  
  343.     bsr GWVA_RSC_RETURN_PTR_ON_OBJ
  344.     move.l a1,a0
  345.  
  346.     move ob_type(a1),d0
  347.     and.w #$ff,d0
  348.     cmp.w #G_TEXT,d0
  349.     beq.s .theres_ted_info
  350.     cmp.w #G_BOXTEXT,d0
  351.     beq.s .theres_ted_info
  352.     cmp.w #G_FTEXT,d0
  353.     beq.s .theres_ted_info
  354.     cmp.w #G_FBOXTEXT,d0
  355.     beq.s .theres_ted_info
  356.  
  357.     move.l ob_spec(a1),a1    ; a1.l = pointeur du texte voulu
  358.     rts
  359. .theres_ted_info:
  360.     move.l ob_spec(a1),a1
  361.     move.l te_ptext(a1),a1    ; a1.l = pointeur du texte voulu
  362.     rts
  363.  
  364. ;------------------------------------------------------------------------------
  365. ; Method name : -
  366. ; Asm label   : GWVA_RSC_COUNT_TEXT_OBJ_LENGTH
  367. ; Description : Renvoie les tailles courantes et max. d'un objet RSC contenant du texte.
  368. ; in  : d0.w = numéro formulaire 
  369. ; in  : d1.w = numéro de l'objet avec ted info : G_TEXT ou G_BOXTEXT ou G_FTEXT 
  370. ;       ou G_FBOXTEXT ou sans : G_STRING ... etc ...
  371. ; out : a0.l = pointeur sur le texte
  372. ; out : a1.l = pointeur sur l'objet ressource
  373. ; out : d0.l = taille courante du texte dans le champs (éventuellement éditable)
  374. ; out : d1.w = taille maximale du texte possible (n'a de sens que pour les textes éditables)
  375. ;
  376. ; 01/02/98 : Création
  377. ;------------------------------------------------------------------------------
  378. GWVA_RSC_COUNT_TEXT_OBJ_LENGTH:
  379.     bsr.s GWVA_RSC_RETURN_PTR_ON_TEXT
  380.     exg.l a1,a0
  381.     bsr GWVA_COUNT_BYTES_0
  382.     move d0,d1        ; par défaut, la longueur max est la longueur
  383.             ; courante
  384.     move ob_type(a1),d2
  385.     and.w #$ff,d2
  386.     cmp.w #G_TEXT,d2
  387.     beq.s .theres_ted_info
  388.     cmp.w #G_BOXTEXT,d2
  389.     beq.s .theres_ted_info
  390.     cmp.w #G_FTEXT,d2
  391.     beq.s .theres_ted_info
  392.     cmp.w #G_FBOXTEXT,d2
  393.     beq.s .theres_ted_info
  394.  
  395.     rts
  396. .theres_ted_info:
  397.     move.w ([a1,ob_spec],te_txtlen),d1    ; longueur du texte max
  398.     subq #1,d1            ; moins le 0
  399.     rts
  400.  
  401.     ifd LIB_MODAL_FORMULARY
  402.  
  403. ;------------------------------------------------------------------------------
  404. ; Method name : -
  405. ; Asm label   : GWVA_RSC_MODAL_FORM
  406. ; Description : Fonction pour l'affichage d'un formulaire modal
  407. ; in  : d0.w = numéro formulaire 
  408. ; out : d0.w = objet EXIT ou TOUCHEXIT
  409. ;
  410. ; 31/01/98 : Création
  411. ;------------------------------------------------------------------------------
  412. GWVA_RSC_MODAL_FORM:
  413.  
  414.     lea GWVA_RSC_TMP_ADD_TREE,a0
  415.     bsr GWVA_RSC_RETURN_PTR_ON_TREE
  416.  
  417.     ifd MDL_COLORS
  418.  
  419.     lea GWVA_ROOT_TMP_PALETTE,a0
  420.     bsr GWVA_ROOT_STORE_VDI_PALETTE
  421.     bsr GWVA_ROOT_SET_DESK_PALETTE
  422.  
  423.     endc    ; ifd MDL_COLORS
  424.  
  425.     wind_update #BEG_UPDATE
  426.     wind_update #BEG_MCTRL
  427.  
  428.     form_center GWVA_RSC_TMP_ADD_TREE
  429.     movem.w int_out+1*2,d1-d4
  430.  
  431.     save.w d1-d4
  432.     graf_mouse #M_OFF
  433.     movem.w (sp),d1-d4
  434.     form_dial #FMD_START,#0,#0,#0,#0,d1,d2,d3,d4
  435.     movem.w (sp),d1-d4
  436.     form_dial #FMD_GROW,#0,#0,#10,#10,d1,d2,d3,d4
  437.     movem.w (sp),d1-d4
  438.     objc_draw GWVA_RSC_TMP_ADD_TREE,#0,#12,d1,d2,d3,d4
  439.     graf_mouse #M_ON
  440.  
  441.     form_do GWVA_RSC_TMP_ADD_TREE,#0
  442.     load.w d1-d4
  443.     save.w d0-d4
  444.     move.l GWVA_RSC_TMP_ADD_TREE,a0
  445.     move d0,d1
  446.     mulu #L_OBJECT,d1
  447.     bclr #SELECTED,ob_state+1(a0,d1.l)    ; de-selected
  448.  
  449.     graf_mouse #M_OFF
  450.     movem.w (sp),d0-d4
  451.     form_dial #FMD_SHRINK,#0,#0,#10,#10,d1,d2,d3,d4
  452.     movem.w (sp),d0-d4
  453.     form_dial #FMD_FINISH,#0,#0,#0,#0,d1,d2,d3,d4
  454.     graf_mouse #M_ON
  455.  
  456.     wind_update #END_MCTRL
  457.     wind_update #END_UPDATE
  458.  
  459.     ifd MDL_COLORS
  460.  
  461.     lea GWVA_ROOT_TMP_PALETTE,a0
  462.     bsr GWVA_ROOT_SET_VDI_PALETTE
  463.  
  464.     endc    ; ifd MDL_COLORS
  465.  
  466.     load.w d0-d4
  467.     rts
  468.  
  469.      endc    ; ifd LIB_MODAL_FORMULARY
  470.  
  471. ;------------------------------------------------------------------------------
  472. ; Method name : -
  473. ; Asm label   : GWVA_RSC_ALERT_BOX
  474. ; Description : Fonction pour l'affichage d'une boite d'alerte à partir d'un ressource
  475. ;
  476. ; in  : d0.w = numéro de l'alert box dans le ressource
  477. ; in  : d1.w = numero du bouton par défaut gauche(1)->milieu(2)->droite(3)
  478. ; out : d0.w = numéro du bouton pressé
  479. ;
  480. ; 31/01/98 : Création
  481. ;------------------------------------------------------------------------------
  482. GWVA_RSC_ALERT_BOX:
  483.  
  484.     save.w d1
  485.     rsrc_gaddr #5,d0    ; R_STRING : Free String Data
  486.     move.l addr_out,a0
  487.     load.w d0
  488.  
  489.     bsr GWVA_ROOT_PRG_ALERT_BOX
  490.  
  491.     rts
  492.  
  493. ;------------------------------------------------------------------------------
  494. ; Method name : -
  495. ; Asm label   : GWVA_RSC_RETURN_PTR_ON_TREE
  496. ; Description : Renvoie un pointeur sur un arbre RSC
  497. ;
  498. ; in  : a0.l = adresse de stockage de l'adresse de base du formulaire
  499. ; in  : d0.w = numéro du formulaire
  500. ; out : (a0) = pointeur sur l'arbre
  501. ; out : d0.w = 0 si erreur, <> 0 sinon.
  502. ;
  503. ; 11/01/98 : Création
  504. ;------------------------------------------------------------------------------
  505. GWVA_RSC_RETURN_PTR_ON_TREE:
  506.  
  507.     save.l a0
  508.     rsrc_gaddr #0,d0    ; En retour, d0<>0 = Ok
  509.     load.l a0
  510.     move.l addr_out,(a0)
  511.     rts
  512.  
  513. ;------------------------------------------------------------------------------
  514. ; Method name : -
  515. ; Asm label   : GWVA_RSC_RETURN_PTR_ON_OBJ
  516. ; Description : Renvoie un pointeur sur un objet RSC dans un formulaire
  517. ;
  518. ; in  : d0.w = numéro du formulaire
  519. ; in  : d1.w = numéro de l'objet
  520. ; out : a1.l = pointeur sur l'objet GEM
  521. ;
  522. ; 11/01/98 : Création
  523. ;------------------------------------------------------------------------------
  524. GWVA_RSC_RETURN_PTR_ON_OBJ:
  525.  
  526.     save.w d1
  527.     lea GWVA_RSC_TMP_ADD_TREE,a0
  528.     bsr.s GWVA_RSC_RETURN_PTR_ON_TREE
  529.     move.l (a0),a1
  530.     load.w d0
  531.     mulu #L_OBJECT,d0
  532.     add.l d0,a1
  533.     rts
  534.  
  535. *-----
  536.     ifd MDL_MENU
  537.  
  538. ;------------------------------------------------------------------------------
  539. ; Method name : -
  540. ; Asm label   : GWVA_RSC_FIND_SON_OBJECT_FROM_ORDINAL
  541. ; Description : retourne un pointeur sur le fils No X d'un père
  542. ;
  543. ; in  : a0.l = pointeur sur un tree
  544. ; in  : d0.w = ordinal du fils (0,...) recherché
  545. ; in  : d1.w = index du père
  546. ; out : a0.l = pointeur sur le fils recherché
  547. ; out : d0.w = index du fils recherché
  548. ; out : d7.w = GWVA_ERROR_GENERIC si pas dans la liste des fils
  549. ;
  550. ; 17/01/98 : Création
  551. ;------------------------------------------------------------------------------
  552. GWVA_RSC_FIND_SON_OBJECT_FROM_ORDINAL:
  553.  
  554.     move d1,d2
  555.     mulu #L_OBJECT,d2
  556.     lea 0(a0,d2.l),a1
  557.     move.w ob_head(a1),d3
  558.     bmi.s .pas_trouve_fils
  559.     sub.w #1,d0
  560.     bmi.s .trouve_fils
  561.  
  562. .boucle:    mulu #L_OBJECT,d3
  563.     lea 0(a0,d3.l),a1
  564.     move ob_next(a1),d3
  565.     cmp.w d1,d3
  566.     beq.s .pas_trouve_fils
  567.     sub.w #1,d0
  568.     bpl.s .boucle
  569. .trouve_fils:
  570.     move.w d3,d0
  571.     mulu #L_OBJECT,d3
  572.     lea 0(a0,d3.l),a0
  573.     moveq #GWVA_NO_ERROR_GENERIC,d7
  574.     rts
  575. .pas_trouve_fils:
  576.     moveq #GWVA_ERROR_GENERIC,d7
  577.     rts
  578.  
  579. ;------------------------------------------------------------------------------
  580. ; Method name : -
  581. ; Asm label   : GWVA_RSC_FIND_ORDINAL_SON_OBJECT
  582. ; Description : renvoie le No ordinal d'un fils par rapport à son père
  583. ;
  584. ; in  : a0.l = pointeur objet root d'un form
  585. ; in  : d0.w = numéro du fils
  586. ; in  : d1.w = numéro du père
  587. ; out : a0.l = pointeur sur le fils
  588. ; out : d0.w = ordinal du fils (0,...)
  589. ; out : d7.w = GWVA_NO_ERROR_GENERIC si OK
  590. ;       ou GWVA_ERROR_GENERIC si pas dans la liste des fils
  591. ;
  592. ; 14/02/98 : Création
  593. ;------------------------------------------------------------------------------
  594. GWVA_RSC_FIND_ORDINAL_SON_OBJECT:
  595.  
  596.     move d1,d2
  597.     mulu #L_OBJECT,d2
  598.     lea 0(a0,d2.l),a1
  599.     moveq #0,d4        ; 1er fils
  600.     move.w ob_head(a1),d3
  601.     bmi.s .pas_de_fils
  602.     cmp.w d0,d3
  603.     beq.s .trouve_fils
  604.  
  605. .boucle:    mulu #L_OBJECT,d3
  606.     lea 0(a0,d3.l),a1
  607.     add.w #1,d4
  608.  
  609.     move ob_next(a1),d3
  610.     cmp.w d1,d3        ; on est revenu au père : erreur
  611.     beq.s .pas_trouve_fils
  612.     cmp.w d0,d3
  613.     bne.s .boucle
  614. .trouve_fils:
  615.     mulu #L_OBJECT,d3
  616.     lea 0(a0,d3.l),a0
  617.     move.w d4,d0
  618.     moveq #GWVA_NO_ERROR_GENERIC,d7
  619.     rts
  620. .pas_de_fils:
  621. .pas_trouve_fils:
  622.     moveq #GWVA_ERROR_GENERIC,d7
  623.     rts
  624.  
  625.     endc    ; ifd MDL_MENU
  626.  
  627.     ifd MDL_GEM        ; en ont besoin : le menu et l'objet popup
  628.  
  629. ;------------------------------------------------------------------------------
  630. ; Method name : -
  631. ; Asm label   : GWVA_RSC_FIND_FATHER_OBJECT
  632. ; Description : renvoie l'index du père d'un objet
  633. ;
  634. ; in  : a0.l : pointeur objet root d'un form
  635. ; in  : d0.w : numéro du fils dont on cherche le père
  636. ; out : a0.l : pointeur sur cet objet (le père)
  637. ; out : d0.w : index du père
  638. ; out : d7.w = GWVA_NO_ERROR_GENERIC si OK
  639. ;       ou GWVA_ERROR_GENERIC si pas de père
  640. ;
  641. ; 14/02/98 : Création
  642. ;------------------------------------------------------------------------------
  643. GWVA_RSC_FIND_FATHER_OBJECT:
  644.  
  645.     tst d0
  646.     beq.s .root
  647.  
  648.     move d0,d1
  649.     mulu #L_OBJECT,d1
  650.     lea 0(a0,d1.l),a1
  651.     move d0,d1        ; d0=courant d1=précédent
  652.  
  653. .boucle:    move ob_next(a1),d0
  654.     move d0,d2
  655.     mulu #L_OBJECT,d2
  656.     lea 0(a0,d2.l),a1    ; a1 : adresse de l'objet courant
  657.     cmp ob_tail(a1),d1    ; est-ce que ob_tail obj suivant = nous ?
  658.     beq.s .found_father
  659.     move d0,d1        ; nouveau précédent = courant pour la suite
  660.     bra.s .boucle
  661. .found_father:
  662.     move.l a1,a0
  663.     moveq #GWVA_NO_ERROR_GENERIC,d7
  664.     rts
  665.  
  666. .root:    moveq #GWVA_ERROR_GENERIC,d7
  667.     rts
  668.  
  669.     endc    ; ifd MDL_GEM
  670.  
  671.     ifd MDL_WIND_MENU
  672.  
  673. ;------------------------------------------------------------------------------
  674. ; Method name : -
  675. ; Asm label   : GWVA_RSC_SHOW_HIDE_TREE
  676. ; Description : montre ou cache un arbre
  677. ;
  678. ; in  : d0.w : index du tree
  679. ; in  : d1.w : index de l'objet RSC
  680. ; in  : d2.w : nouvel état 0 = show, 1 = hide
  681. ; out : a0.l : pointeur sur le fils recherché
  682. ; out : d0.w : index du fils à cacher/montrer
  683. ; out : d7.w : GWVA_ERROR_GENERIC si pas dans la liste des fils
  684. ;
  685. ; 17/01/98 : Création
  686. ;------------------------------------------------------------------------------
  687. GWVA_RSC_SHOW_HIDE_TREE:
  688.  
  689.     save.w d2
  690.     bsr GWVA_RSC_RETURN_PTR_ON_OBJ
  691.     load.w d2
  692.  
  693.     bclr #HIDETREE,ob_flags+1(a1)
  694.     tst d2
  695.     beq.s .cleared
  696.     bset #HIDETREE,ob_flags+1(a1)
  697. .cleared:    rts
  698.  
  699.     endc    ; ifd MDL_WIND_MENU
  700.  
  701.     ifd MDL_RELOCATE_RSC
  702.  
  703.   ifnd LIB_SEARCH_SYSTEM_COOKIES
  704.    ifnd LIB_SEARCH_COOKIES
  705.     ifd OPT_GWVA_DEBUG_PRINT_COMMENTS
  706.    LIST
  707. ;------------------------------------------------------------------------------
  708. ; Rq  : Lorsque vous utilisez MDL_RELOCATE_RSC, définir LIB_SEARCH_SYSTEM_COOKIES
  709. ; Rq  : ou au moins LIB_COOKIE pour permettre d'utiliser les nouvelles 
  710. ; Rq  : fonctionnalités de l'AES 4.
  711. ;------------------------------------------------------------------------------
  712.    NOLIST
  713.     endc
  714.    endc
  715.   endc
  716.  
  717. ;------------------------------------------------------------------------------
  718. ; Method name : -
  719. ; Asm label   : GWVA_RSC_RELOCATE_RSC
  720. ; Description : Fonction faisant la relocation d'un ressource en mémoire
  721. ; Description : et permettant au système de l'utiliser normalement
  722. ;
  723. ; in  : a0.l = pointeur sur le ressource en mémoire
  724. ; out : d7.w = GWVA_NO_ERROR_GENERIC ou GWVA_ERROR_GENERIC
  725. ;
  726. ; 11/01/98 : Création
  727. ;------------------------------------------------------------------------------
  728. GWVA_RSC_RELOCATE_RSC:
  729.  
  730.     cmp.l #0,a0
  731.     ble .erreur_ressource
  732.  
  733.     ifnd LIB_SEARCH_SYSTEM_COOKIES
  734.  
  735.     ifd LIB_COOKIE
  736.  
  737.     move.l #"MagX",GWVA_ROOT_SEARCH_IN_OUT
  738.     save.l a0
  739.     SUPEXEC GWVA_COOKIE_SEARCH_ONE_COOKIE
  740.     load.l a0
  741.     tst.l GWVA_ROOT_SEARCH_IN_OUT
  742.     beq.s .magic_not_present
  743.  
  744.     endc    ; ifd LIB_COOKIE
  745.     else
  746.  
  747.     tst.l GWVA_ROOT_COOKIE_MAGIC    ; l'AES de MagiC est le 3.99 mais il supporte rsrc_rcfix ...
  748.     bne.s .magic_present
  749.     endc    ; ifnd LIB_SEARCH_SYSTEM_COOKIES
  750.  
  751. .magic_not_present:
  752.     cmp.w #$400,global+_AESversion
  753.     blt.s .pas_AES400
  754.  
  755. .magic_present:
  756.  
  757.     rsrc_rcfix a0    ; supporte tous les formats, plus rapide ...
  758.     tst d0
  759.     beq .erreur_ressource
  760.  
  761.     moveq #GWVA_NO_ERROR_GENERIC,d7
  762.     rts
  763.  
  764. .erreur_ressource:
  765.     moveq #GWVA_ERROR_GENERIC,d7
  766.     rts
  767.  
  768. .pas_AES400:
  769.     ; a0.l
  770.     lea GWVA_ROOT_ADD_MALLOC_RSC_ICN,a1
  771.     bsr GWVA_RSC_RELOCATE_RSC_IN_MEM
  772.     cmp.w #GWVA_NO_ERROR_GENERIC,d7
  773.     bne.s .erreur_ressource
  774.  
  775.     move.l a0,a1
  776.     add.w #L_RSC_HEADER,a1
  777.     move.l a1,global+_AESrscfile    ; on stocke l'adresse du début du ressource (documenté)
  778.     move.l a0,global+_AESrscfile+4    ; on stocke l'adresse du début du fichier RSC (non documenté)
  779.     move.w rsh_rssize(a0),global+_AESrscfile+4+4    ; on stocke la taille du ressource (non documenté)
  780.     move.w rsh_vrsn(a0),global+_AESrscfile+4+4+2    ; on stocke la version du ressource (non documenté)
  781.  
  782.     btst #2,rsh_vrsn+1(a0)
  783.     beq.s .old_rsc2
  784. ; Là je sais pas si on doit stocker un mauvaise taille dans le cas d'un
  785. ; formulaire pour l'AES 3.3 ???
  786.     move.l a0,a1
  787.     add.w rsh_rssize(a0),a1
  788.     move.w 2(a1),global+_AESrscfile+4+4
  789. .old_rsc2:
  790.     moveq #GWVA_NO_ERROR_GENERIC,d7
  791.     rts
  792.  
  793. ;------------------------------------------------------------------------------
  794. ; Method name : -
  795. ; Asm label   : GWVA_RSC_RELOCATE_RSC_IN_MEM
  796. ; Description : Fonction faisant uniquement la relocation d'un ressource en mémoire
  797. ;
  798. ; in  : a0.l = pointeur sur le ressource en mémoire
  799. ; in  : a1.l = pointeur sur 2 mots long (pour le traitement des icones couleurs)
  800. ;       le premier contiendra l'adresse du MALLOC des icones couleurs, 0.l sinon.
  801. ;       Au programmeur de libérer cet espace mémoire lorsqu'il n'a plus besoin
  802. ;       du ressource
  803. ; out : d7.w = GWVA_NO_ERROR_GENERIC ou erreur 
  804. ;
  805. ; 11/01/98 : Création
  806. ;------------------------------------------------------------------------------
  807. GWVA_RSC_RELOCATE_RSC_IN_MEM:
  808.  
  809.     move.l a0,d0
  810.     btst #0,d0
  811.     beq.s .rsc_sur_adresse_paire
  812.     ifd OPT_GWVA_DEBUG_ERROR
  813.     lea GWVA_ASCII_ERROR_RSC_ON_ODD_ADDRESS,a6
  814.     illegal
  815.     endc
  816.     bra .erreur_ressource
  817. .rsc_sur_adresse_paire:
  818.  
  819.     clr.l (a1)
  820.     clr.l 4(a1)
  821.  
  822.     tst.w rsh_vrsn(a0)
  823.     beq .old_format
  824.     cmp.w #1,rsh_vrsn(a0)
  825.     beq .old_format
  826.     btst #2,rsh_vrsn+1(a0)
  827.     beq .erreur_ressource
  828.  
  829.     ; New format !
  830.     ; Ne gere pas le format étendu : rsh_vrsn = $0003
  831.  
  832.     bsr .traitement_icones_couleurs
  833.  
  834. .old_format:
  835.     ; fin du traitement des icones couleur, ouf !
  836.  
  837.     move.w #rsh_frstr,d1
  838.     move rsh_nstring(a0),d0
  839.     bsr .reloc_array
  840.     move.w #rsh_frimg,d1
  841.     move rsh_nimages(a0),d0
  842.     bsr .reloc_array
  843.     move.w #rsh_trindex,d1
  844.     move rsh_ntree(a0),d0
  845.     bsr .reloc_array
  846.  
  847.     ; reloc la table des teds_info
  848.     move.l a0,a1
  849.     move.l a0,d7
  850.     add.w rsh_tedinfo(a0),a1
  851.     move rsh_nted(a0),d0
  852.     subq #1,d0
  853.     bmi.s .nothing1
  854. .reloc_ptrs_ted:
  855.     add.l d7,te_ptext(a1)
  856.     add.l d7,te_ptmplt(a1)
  857.     add.l d7,te_pvalid(a1)
  858.     lea L_TEDINFO(a1),a1
  859.     dbf d0,.reloc_ptrs_ted
  860. .nothing1:
  861.     ; reloc la table des icon_blk
  862.     move.l a0,a1
  863.     move.l a0,d7
  864.     add.w rsh_iconblk(a0),a1
  865.     move rsh_nib(a0),d0
  866.     subq #1,d0
  867.     bmi.s .nothing2
  868. .reloc_ptrs_iconblk:
  869.     add.l d7,ib_pmask(a1)
  870.     add.l d7,ib_pdata(a1)
  871.     add.l d7,ib_ptext(a1)
  872.     lea L_ICONBLK(a1),a1
  873.     dbf d0,.reloc_ptrs_iconblk
  874. .nothing2:
  875.     ; reloc la table des bit_blk
  876.     move.l a0,a1
  877.     move.l a0,d7
  878.     add.w rsh_bitblk(a0),a1
  879.     move rsh_nbb(a0),d0
  880.     subq #1,d0
  881.     bmi.s .nothing3
  882. .reloc_ptrs_bitblk:
  883.     add.l d7,bi_pdata(a1)
  884.     lea L_BITBLK(a1),a1
  885.     dbf d0,.reloc_ptrs_bitblk
  886. .nothing3:
  887.     ; reloc la table des cicon_blk
  888.  
  889.     ; parse tous les objets
  890.     move rsh_ntree(a0),d0
  891.     subq #1,d0
  892.     bmi .nothing4
  893.  
  894.     move.l a0,a1
  895.     move.l a0,d7
  896.     add.w rsh_trindex(a0),a1
  897.  
  898. .parse_all_trees:
  899.     move.l (a1)+,a2
  900.  
  901.     move #1-1,d1
  902.     tst ob_tail(a2)
  903.     bmi.s .pas_de_fils
  904.     move ob_tail(a2),d1    ; +1 pour le père -1 pour dbf
  905. .pas_de_fils:
  906.  
  907.     clr d2        ; No objet = pere
  908. .parse_all_this_tree:        ; -4(a1) =ptr tree a2=ptr object
  909.  
  910.     move.w ob_type(a2),d3
  911.     and.w #$ff,d3
  912.  
  913.     cmp.w #G_TEXT,d3
  914.     beq.s .reloc_ted
  915.     cmp.w #G_BOXTEXT,d3
  916.     beq.s .reloc_ted
  917.     cmp.w #G_FTEXT,d3
  918.     beq.s .reloc_ted
  919.     cmp.w #G_FBOXTEXT,d3
  920.     bne.s .no_reloc_ted
  921.  
  922. .reloc_ted:    add.l d7,ob_spec(a2)
  923.  
  924. .no_reloc_ted:
  925.  
  926.     cmp.w #G_IMAGE,d3
  927.     beq.s .reloc_classique
  928.     cmp.w #G_BUTTON,d3
  929.     beq.s .reloc_classique
  930.     cmp.w #G_STRING,d3
  931.     beq.s .reloc_classique
  932.     cmp.w #G_ICON,d3
  933.     beq.s .reloc_classique
  934.     cmp.w #G_TITLE,d3
  935.     beq.s .reloc_classique
  936.     cmp.w #G_CICON,d3
  937.     bne.s .reloc_done
  938.  
  939.     move.l ob_spec(a2),d4
  940.     lsl.l #2,d4
  941.     move.l a0,a3
  942.     add.w rsh_rssize(a0),a3
  943.     lea ([4,a3],a0.l),a3    ; ptr table de ptrs sur les Cicons blk
  944.     move.l (a3,d4.l),ob_spec(a2)
  945.     bra.s .reloc_done
  946.  
  947. .reloc_classique:
  948.     add.l d7,ob_spec(a2)
  949.  
  950. .reloc_done:
  951. .pas_reloc_struct:
  952.  
  953.     save.l d0-d2/d7/a0-a2
  954.     rsrc_obfix -4(a1),d2    ; caractère -> pixel
  955.     load.l d0-d2/d7/a0-a2
  956.  
  957.     move.w ob_head(a2),d3
  958.     bmi.s .pas_de_fils2
  959.  
  960.     move.w d3,d2
  961.     mulu #L_OBJECT,d3
  962.     add.l -4(a1),d3
  963.     move.l d3,a2
  964.     bra.s .next_object
  965.  
  966. .pas_de_fils2:
  967. .next_is_dad:
  968.     move.w d2,d3        ; objet courant
  969.  
  970.     move.w ob_next(a2),d2
  971.     ble.s .pas_de_frere_pere    ; -> le suivant est le root ou le root est tout seul
  972.  
  973.     move.w d2,d4
  974.     mulu #L_OBJECT,d4
  975.     add.l -4(a1),d4
  976.     move.l d4,a2
  977.     cmp.w ob_tail(a2),d3
  978.     beq.s .next_is_dad
  979.  
  980. .next_object:
  981.     bra .parse_all_this_tree
  982. .pas_de_frere_pere:
  983.  
  984.     dbf d0,.parse_all_trees
  985. .nothing4:
  986.     moveq #GWVA_NO_ERROR_GENERIC,d7
  987.     rts
  988.  
  989. .erreur_ressource:
  990.     moveq #GWVA_ERROR_GENERIC,d7
  991.     rts
  992.  
  993.     *--------------------------*
  994.  
  995. .traitement_icones_couleurs:
  996.     move.l a0,a2
  997.     add.w rsh_rssize(a0),a2
  998.     move.l 4(a2),d0
  999.     lea (a0,d0.l),a2    ; ptr table de ptrs sur les Cicons blk
  1000.  
  1001.     move.l a2,a3
  1002.     moveq #-1,d0
  1003. .count:    addq #1,d0
  1004.     tst.l (a3)+
  1005.     beq.s .count
  1006.             ; a2 pointe sur le premier CICONBLK
  1007.     subq #1,d0        ; nbre d'icone couleur
  1008.  
  1009.     tst d0
  1010.     bmi .no_cicon
  1011.  
  1012. *    cmp.w #2,GWVA_ROOT_VDI_WORKSTATION+39*2    ; nbre de couleur de la station
  1013. *    beq .pas_besoin_icones_couleurs    ; en monochrome, on prend la definition monochrome
  1014.  
  1015.     clr.l d4        ; taille des icones couleurs à réserver
  1016.     clr.l d7        ; taille max d'une icone
  1017. ;
  1018.     save.l d0/a1-a2
  1019.  
  1020. .parse_all_icons1:
  1021.     save.w d0
  1022.  
  1023.     move.l a3,(a2)+
  1024.  
  1025.     move.l a3,a4
  1026.     add.l #L_CICONBLK,a4
  1027.     move ib_wicon(a3),d1
  1028.     ext.l d1
  1029.     divu #16/2,d1
  1030.     mulu ib_hicon(a3),d1        ; d1=taille mono en byte
  1031.     move.l a4,ib_pdata(a3)
  1032.     add.l d1,a4
  1033.     move.l a4,ib_pmask(a3)
  1034.     add.l d1,a4
  1035.     move.l a4,ib_ptext(a3)
  1036.     add.w #12,a4        ; longeur d'un texte
  1037.  
  1038.     move.l mainlist(a3),d2        ; nb_cicon >=1
  1039.     subq.w #1,d2
  1040.  
  1041.     move.w GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d5    ; nbre de plans affichés
  1042.  
  1043. .find_a_good_resolution_for_this_icone:
  1044.     save.l d2/a4        ; d2 : nbr de résolution, a4 pointe la liste de résolution
  1045.     bsr .parse_all_icone_resolutions
  1046.     move.l a4,a5
  1047.     load.l d2/a4
  1048.  
  1049.     tst d0
  1050.     beq.s .good_resolution_found
  1051.  
  1052.     lsr.w #1,d5        ; 8 -> 4 -> 2 -> 1 plans ...
  1053.     tst d5
  1054.     bne .find_a_good_resolution_for_this_icone
  1055.  
  1056.     lea 0.w,a5        ; pas d'icone couleur correspondant a la résolution souhaitée
  1057. .good_resolution_found:
  1058.     move.l a5,mainlist(a3)    ; on pointe directement sur l'icone correspondant le mieux à la résolution souhaitée
  1059.  
  1060.     move.w #-1,d5    ; pour passer les définitions de cette icone
  1061.     bsr .parse_all_icone_resolutions
  1062.     move.l a5,a3    ; icone suivante
  1063.  
  1064.     load.w d0
  1065.     dbf d0,.parse_all_icons1
  1066.  
  1067.     load.l d0/a1-a2
  1068.  
  1069.     tst.l d4        ; reservation memoire ?
  1070.     bne.s .malloc_icone
  1071.  
  1072.     tst.l d7
  1073.     bne.s .malloc_transfert
  1074.  
  1075.     bra.s .pas_de_malloc
  1076.  
  1077. .malloc_icone:
  1078.     save.l d0/d7/a0-a2
  1079.     MXALLOC #MX_PREFTTRAM,d4
  1080.     move.l d0,d1
  1081.     load.l d0/d7/a0-a2
  1082.     move.l d1,(a1)
  1083. .malloc_transfert:
  1084.     save.l d0/a0-a2
  1085.     add.l d7,d7        ; pour la selection eventuelle
  1086.     MXALLOC #MX_PREFTTRAM,d7
  1087.     move.l d0,d1
  1088.     load.l d0/a0-a2
  1089.     move.l d1,4(a1)
  1090. .pas_de_malloc:
  1091.  
  1092.  
  1093. *.pas_besoin_icones_couleurs:
  1094.  
  1095.     move.l (a1),d4    ; adresse du malloc pour les icones couleurs
  1096.  
  1097. .parse_all_icons2:
  1098.     move.l (a2)+,a3
  1099.  
  1100. *    move.l a3,a4
  1101. *    add.l #L_CICONBLK,a4        ; ?_ERROR_? (lignes ->    move.l mainlist(a3),a4        ; on pointe directement sur la bonne icone
  1102.     move ib_wicon(a3),d1
  1103.     ext.l d1
  1104.     divu #16/2,d1
  1105.     mulu ib_hicon(a3),d1        ; d1=taille mono en byte
  1106.     
  1107.     move.l mainlist(a3),a4        ; on pointe directement sur la bonne icone
  1108.     cmp.l #0,a4
  1109.     beq .pas_definition_couleur
  1110.  
  1111.     move.w d1,d3        ; taille mono
  1112.     mulu num_planes(a4),d3        ; d3.l taille icone couleur
  1113.  
  1114.     move.l col_data(a4),a5
  1115.     move.l 4(a1),d7
  1116.     bsr .cree_resolution_icone
  1117.  
  1118.     move d1,d5
  1119.     mulu GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d5
  1120.     add.l d5,d7
  1121.  
  1122.     tst.l sel_data(a4)
  1123.     beq.s .pas_icone_selectionnee2
  1124.  
  1125.     move.l sel_data(a4),a5
  1126.     bsr .cree_resolution_icone
  1127.  
  1128. .pas_icone_selectionnee2:
  1129.  
  1130.     move.w num_planes(a4),d5
  1131.  
  1132.     cmp.w GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d5
  1133.     beq.s .transformation_en_place
  1134.  
  1135.     move.l d4,col_data(a4)        ; adresse de stockage finale
  1136.     move d1,d6
  1137.     mulu GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d6
  1138.     add.l d6,d4
  1139. .transformation_en_place:
  1140.  
  1141.     save.l d4-d5
  1142.  
  1143.     move.w GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,num_planes(a4)
  1144.     move.l 4(a1),d4        ; source icone
  1145.     move.l col_data(a4),d5        ; destination
  1146.     
  1147.     bsr .remets_plans_entrelaces_en_place
  1148.  
  1149.     load.l d4-d5
  1150.  
  1151.     tst.l sel_data(a4)
  1152.     beq.s .pas_icone_selectionnee3
  1153.  
  1154.     cmp.w GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d5
  1155.     beq.s .transformation_en_place2
  1156.  
  1157.     move.l d4,sel_data(a4)
  1158.     move d1,d6
  1159.     mulu GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d6
  1160.     add.l d6,d4
  1161. .transformation_en_place2:
  1162.  
  1163.     save.l d4
  1164.  
  1165.     move.l 4(a1),d4
  1166.     move d1,d5
  1167.     mulu GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d5
  1168.     add.l d5,d4                ; source
  1169.     move.l sel_data(a4),d5            ; destination
  1170.  
  1171.     bsr .remets_plans_entrelaces_en_place
  1172.  
  1173.     load.l d4
  1174.  
  1175. .pas_icone_selectionnee3:
  1176.     clr.l next_res(a4)
  1177.  
  1178. .pas_definition_couleur:
  1179. *.pas_icones_couleurs:
  1180.  
  1181.     dbf d0,.parse_all_icons2
  1182.  
  1183.     tst.l 4(a1)
  1184.     beq.s .pas_buffer_temp
  1185.     save.l a0-a1
  1186.     MFREE 4(a1)
  1187.     load.l a0-a1
  1188.     clr.l 4(a1)
  1189. .pas_buffer_temp:
  1190.  
  1191. .no_cicon:
  1192.     rts
  1193.  
  1194.     *--------------------------------------*
  1195. .parse_all_icone_resolutions:
  1196. ; d1.w : taille icone mono
  1197. ; d4.l=0
  1198. ; d5.w : résolution souhaitée
  1199. ; d7.l=0
  1200. ; a4.l : pointeur liste des résolutions
  1201.     move.w d1,d3        ; taille mono
  1202.     mulu num_planes(a4),d3        ; d3.l taille icone couleur
  1203.     move.l a4,a5
  1204.     add.l #L_CICON,a5
  1205.     move.l a5,col_data(a4)
  1206.     add.l d3,a5
  1207.     move.l a5,col_mask(a4)
  1208.     add.l d1,a5
  1209.  
  1210. ; Est-ce une icone de la resolution recherchée ?
  1211.     cmp.w num_planes(a4),d5
  1212.     bne.s .saute_icone_couleur1
  1213.  
  1214.     save.l d0
  1215.  
  1216.     move d1,d0
  1217.     mulu GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d0    ; d0.l taille icone couleur à la résolution de la station
  1218.  
  1219. ; Est-ce une icone directement affichable ?
  1220.     move.w GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d6
  1221.     cmp.w num_planes(a4),d6
  1222.     beq.s .pas_de_reservation1    ; transformation en place si icone de meme résolution
  1223.  
  1224. ; Il faut reserver la place de l'icone
  1225.     add.l d0,d4
  1226.  
  1227. .pas_de_reservation1:
  1228.     cmp.l d0,d7
  1229.     bge.s .max_taille_icone
  1230.     move.l d0,d7
  1231. .max_taille_icone:
  1232.  
  1233.     load.l d0
  1234. .saute_icone_couleur1:
  1235.  
  1236.     tst.l sel_data(a4)
  1237.     beq.s .pas_icone_selectionee
  1238.  
  1239.     move.l a5,sel_data(a4)
  1240.     add.l d3,a5
  1241.     move.l a5,sel_mask(a4)
  1242.     add.l d1,a5
  1243.  
  1244.     cmp.w num_planes(a4),d5
  1245.     bne.s .saute_icone_couleur2
  1246.  
  1247.     move.w GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d6
  1248.     cmp.w num_planes(a4),d6
  1249.     beq.s .pas_de_reservation2        ; transformation en place si icone de meme résolution
  1250.  
  1251.     move d1,d6
  1252.     mulu GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d6
  1253.     add.l d6,d4
  1254. .pas_de_reservation2:
  1255.  
  1256. .saute_icone_couleur2:
  1257. .pas_icone_selectionee:
  1258.  
  1259.     cmp.w num_planes(a4),d5
  1260.     beq.s .end_good_resolution_found
  1261.  
  1262.     move.l a5,a4        ; résolution suivante
  1263.     dbf d2,.parse_all_icone_resolutions
  1264.  
  1265.     move.w #-1,d0        ; pas de résolution
  1266.     rts
  1267. .end_good_resolution_found:
  1268.     clr.w d0
  1269.     rts
  1270.  
  1271.     *--------------------------------------*
  1272.  
  1273. .cree_resolution_icone:
  1274.     move.l d7,a6
  1275.     move.l d3,d6
  1276.     lsr.l #1,d6
  1277. .recopie_icone:
  1278.     move.w (a5)+,(a6)+
  1279.     subq.l #1,d6
  1280.     bne.s .recopie_icone
  1281.  
  1282.     save.w d0
  1283.  
  1284.     move.w GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d0
  1285.     sub.w num_planes(a4),d0
  1286.     beq.s .pas_de_plan_en_plus
  1287.  
  1288.     move.l d7,a5    ; zone de recopie
  1289.     move.w d1,d6    ; taille d'un plan
  1290.     sub.w #1,d6
  1291. .cree_plans_icone:
  1292.     move.l a5,a6
  1293.     move.w (a5)+,d5
  1294.     move.w num_planes(a4),d0
  1295.     subq.w #1,d0
  1296. .and_plans:    and.w (a6),d5
  1297.     lea (a6,d1.w),a6
  1298.     dbf d0,.and_plans
  1299.  
  1300.     move.w GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d0
  1301.     sub.w num_planes(a4),d0        ; on doit ajoutter des plans vides
  1302.     subq.w #1,d0
  1303. .move_plans:move d5,(a6)
  1304.     lea (a6,d1.w),a6
  1305.     dbf d0,.move_plans
  1306.  
  1307.     dbf d6,.cree_plans_icone
  1308.  
  1309. .pas_de_plan_en_plus:
  1310.     load.w d0
  1311.     rts
  1312.  
  1313.     *--------------------------------------*
  1314. .remets_plans_entrelaces_en_place:
  1315.     lea GWVA_ROOT_MFDB_SRC,a5
  1316.     move.l d4,(a5)+        ; pointeur image
  1317.     move.l ib_wicon(a3),(a5)+    ; largeur/hauteur image pixel
  1318.     move.w ib_wicon(a3),d6
  1319.     add.w #15,d6
  1320.     ext.l d6
  1321.     divu #16,d6
  1322.     move.w d6,(a5)+        ; largeur image en mots
  1323.     move.w #1,(a5)+        ; device independent
  1324.     move.w num_planes(a4),(a5)+
  1325.     clr.w (a5)+            ; reservés
  1326.     clr.w (a5)+
  1327.     clr.w (a5)+
  1328.  
  1329.     lea GWVA_ROOT_MFDB_DEST,a5
  1330.     move.l d5,(a5)+        ; pointeur image
  1331.     move.l ib_wicon(a3),(a5)+    ; largeur/hauteur image pixel
  1332.     move.w ib_wicon(a3),d6
  1333.     add.w #15,d6
  1334.     ext.l d6
  1335.     divu #16,d6
  1336.     move.w d6,(a5)+        ; largeur image en mots
  1337.     move.w #0,(a5)+        ; device dependent
  1338.     move.w num_planes(a4),(a5)+
  1339.     clr.w (a5)+            ; reservés
  1340.     clr.w (a5)+
  1341.     clr.w (a5)+
  1342.  
  1343.     save.l d0-d3/a0-a4
  1344.     vr_trnfm #GWVA_ROOT_MFDB_SRC,#GWVA_ROOT_MFDB_DEST
  1345.     load.l d0-d3/a0-a4
  1346.     rts
  1347.  
  1348.     *--------------------------------------*
  1349. .reloc_array:
  1350.     move.l a0,a1
  1351.     move.l a0,d7
  1352.     add.w (a0,d1.w),a1
  1353.     subq #1,d0
  1354.     bmi.s .nothing
  1355. .reloc_array2:
  1356.     add.l d7,(a1)+
  1357.     dbf d0,.reloc_array2
  1358. .nothing:    rts
  1359.  
  1360.     endc    ; ifd MDL_RELOCATE_RSC
  1361.  
  1362. ;------------------------------------------------------------------------------
  1363.  
  1364.     BSS
  1365.  
  1366. GWVA_RSC_TMP_ADD_TREE:    ds.l 1
  1367.  
  1368.     TEXT
  1369.